<?php

/**
 * node.class.php
 * Clase Base para los nodos html
 * 
 * @author christian.mosquera
 * @copyright Thomas MTI - 10-jul-2012
 */
class Node {

    private $Active = TRUE;
    private $Attributes = array();
    private $Childrens = NULL;
    private $Content = FALSE;
    private $Html = NULL;
    private $Name = NULL;

    /**
     * 
     * @param string $Html (opcional) Html plano a mostrar dentro de la etiqueta
     * @param array $Attributes (opcional) Array asociativo de atributos
     * @param array $Childrens (opcional) Array de Nodos
     */
    function __construct($Html = '', $Attributes = array(), $Childrens = array()) {
        $this->Childrens = is_array($Childrens) ? $Childrens : array();
        $this->Html = $Html;
        if (is_array($Attributes) && count($Attributes) > 0)
            $this->setAttribute($Attributes);
    }

    /**
     * Borrar nodo actual
     */
    public function Delete() {
        $this->Active = FALSE;
        $this->Attributes = NULL;
        $this->Childrens = NULL;
        $this->Content = NULL;
        $this->Html = NULL;
        $this->Name = NULL;
    }

    /**
     * 
     * @param string $key Nombre del atributo
     * @return string Valor del atributo
     */
    public function getAttribute($key) {
        return $this->Attributes[$key];
    }

    /**
     * 
     * @param array $Attribute Array con combinacion de Nombre y Valor del atributo
     */
    public function setAttribute(array $Attribute) {
        foreach ($Attribute as $key => $value)
            $this->Attributes[$key] = $value;
    }

    /**
     * 
     * @param Node $Children Adiciona un hijo (Nodo) al nodo actual
     */
    public function addChildren($Children) {
        if (is_subclass_of($Children, 'Node'))
            array_push($this->Childrens, $Children);
    }

    /**
     * 
     * @param Integer $Index Indice de Posicion del hijo
     * @return Nodo Nodo Hijo
     */
    public function getChildren($Index) {
        return $this->Childrens[$Index];
    }

    /**
     * 
     * @return boolean Retorna si el nodo posee contenido(html)
     */
    public function getContent() {
        return $this->Content;
    }

    /**
     * 
     * @param string $Content Asigna si el nodo actual bebe tener contenido(html)
     */
    protected function setContent($Content) {
        if (is_bool($Content))
            $this->Content = $Content;
    }

    /**
     * 
     * @return string Retorna el contenido html del nodo actual
     */
    public function getHtml() {
        return $this->Html;
    }

    /**
     * 
     * @param string $Html Asigna contenido html al nodo actual
     */
    public function setHtml($Html) {
        $this->Html = $Html;
    }

    /**
     * 
     * @return string Retorna el nombre del nodo actual
     */
    public function getName() {
        return $this->Name;
    }

    /**
     * 
     * @param astring $Name Asigna el nombre al nodo actual
     */
    protected function setName($Name) {
        $this->Name = $Name;
    }

    /**
     * Renderiza el nodo actual y a sus hijos
     */
    public final function render() {
        if ($this->Active) {
            echo '<' . $this->getName() . ' ';
            if (count($this->Attributes) > 0)
                foreach ($this->Attributes as $key => $value)
                    echo $key . '="' . $value . '"';

            if ($this->getContent()) {
                echo '>';
                echo $this->Html;
                if (!is_null($this->Childrens))
                    foreach ($this->Childrens as $Child) {
                        $Child->render();
                    }
                echo '</' . $this->getName() . '>';
            } else {
                echo '/>';
            }
        }
    }

}

?>